# -*- coding:utf-8 -*-
#用Rpi.GPIO写控制
import RPi.GPIO as gpio
import time

'''
电路             树莓派接口
行：
    SI   -------> 7 #行扫描数据输入口
    OE   -------> 11 #行扫描输出控制口（低电平输出有效）
    STCP -------> 12 #输出至存储器时钟（低电平变高电平时，更新数据）
    SHCP -------> 13 #数据移位时钟（低电平变高电平时，位移数据）
列：
    SI   -------> 15 #列扫描数据输入
    STCP -------> 18 #同（13引脚）
    SHCP -------> 16 #同（15引脚）
调压：
    ABL  -------> 22 #控制电压使用

电平转换器  A1      A2      A3      A4      A5      A6      A7      A8
40针物理口  07      11      12      13      15      16      18      22
wiringpi口   7       0       1       2       3       4       5       6
元器件对应  行SI    行OE    行STCP  行SHCP  列SI    列SHCP  列STCP   电压

'''
p_row = [7, 13, 12]  # si, shcp, stcp
p_col = [15, 16, 18]
p_oe = 11
p_volt = 22

def io_init():
    gpio.setwarnings(False)
    gpio.setmode(gpio.BOARD)
    gpio.setup(p_row, gpio.OUT, initial=gpio.LOW)
    gpio.setup(p_col, gpio.OUT, initial=gpio.LOW)
    gpio.setup(p_oe, gpio.OUT, initial=gpio.LOW)
    gpio.setup(p_volt, gpio.OUT, initial=gpio.HIGH)

def hc595_senddata(si=0x00, bit=8, chip=p_row):
    bin_data = bin(si)[2:].zfill(bit)
    for i in bin_data:
        gpio.output(chip[2], gpio.LOW)
        if i == '0':
            gpio.output(chip[0], gpio.LOW)
        else:
            gpio.output(chip[0], gpio.HIGH)
        gpio.output(chip[2], gpio.HIGH)
        time.sleep(0.001)  # delay1ms
    gpio.output(chip[1], gpio.LOW)
    time.sleep(0.001)  # delay1ms
    gpio.output(chip[1], gpio.HIGH)

if __name__ == '__main__':
    io_init()
    hc595_senddata(0x0f)
    for i in range(8):
        hc595_senddata(0x00, 8, p_col)
